#include "global.h"

// 用于控制蜂鸣器的计数器
static uint16_t beep_counter = 0;

#define BUZZ_H BEEP_PORT->BSRR = BEEP_PIN_BUZZ
#define BUZZ_L BEEP_PORT->BRR = BEEP_PIN_BUZZ

/**
 * @brief 初始化蜂鸣器
 *
 * 配置蜂鸣器GPIO引脚为推挽输出模式，并使能相关时钟。
 */
void beep_init(void)
{
    // 使能蜂鸣器GPIO端口的时钟
    RCC_APB2PeriphClockCmd(BEEP_RCC, ENABLE);

    // 配置蜂鸣器GPIO引脚为推挽输出模式，速度为50MHz
    GPIO_InitTypeDef GPIO_InitStructure = {
        .GPIO_Mode = GPIO_Mode_Out_PP, // 推挽输出模式
        .GPIO_Speed = GPIO_Speed_50MHz // 输出速度为50MHz
    };
    GPIO_InitStructure.GPIO_Pin = BEEP_PIN_BUZZ; // 指定蜂鸣器引脚
    GPIO_Init(BEEP_PORT, &GPIO_InitStructure);   // 初始化GPIO配置
}

/**
 * @brief 蜂鸣器定时器中断服务函数
 *
 * 在定时器中断中根据计数器值控制蜂鸣器的开关状态。
 */
void beep_ticks(void)
{
    // 如果计数器大于0，则保持蜂鸣器高电平并递减计数器
    if (beep_counter > 0)
    {
        beep_counter--;
        BUZZ_H; // 设置蜂鸣器引脚为高电平
    }
    else
    {
        // 如果计数器为0，则关闭蜂鸣器
        BUZZ_L; // 设置蜂鸣器引脚为低电平
    }
}

/**
 * @brief 设置蜂鸣器的持续时间
 *
 * 设置蜂鸣器的工作时间（单位为定时器中断周期）。
 *
 * @param duration 蜂鸣器工作时间（以定时器中断周期为单位）
 */
void beep_setDuration(uint16_t duration)
{
    // 将计数器设置为指定的持续时间
    beep_counter = duration;
}
